package systemEntity

import (
	contractorm "github.com/goravel/framework/contracts/database/orm"
	"github.com/goravel/framework/database/orm"
	"github.com/goravel/framework/facades"
)

// EbSystemMenus 菜单表
type SystemMenus struct {
	orm.Model
	Pid        uint          `json:"pid" gorm:"column:pid" form:"pid"`                            // 父级id
	Icon       string        `json:"icon" gorm:"column:icon" form:"icon"`                         // 图标
	MenuName   string        `json:"menu_name" gorm:"column:menu_name" form:"menu_name"`          // 按钮名
	Module     string        `json:"-" gorm:"column:module" form:"module"`                        // 模块名
	Controller string        `json:"-" gorm:"column:controller" form:"controller"`                // 控制器
	Action     string        `json:"-" gorm:"column:action" form:"action"`                        // 方法名
	ApiUrl     string        `json:"-" gorm:"column:api_url" form:"api_url"`                      // api接口地址
	Methods    string        `json:"-" gorm:"column:methods" form:"methods"`                      // 提交方式POST GET PUT DELETE
	Params     string        `json:"-" gorm:"column:params" form:"params"`                        // 参数
	Sort       int8          `json:"sort" gorm:"column:sort" form:"sort"`                         // 排序
	IsShow     int8          `json:"is_show" gorm:"column:is_show" form:"is_show"`                // 是否为隐藏菜单0=隐藏菜单,1=显示菜单
	IsShowPath int8          `json:"is_show_path" gorm:"column:is_show_path" form:"is_show_path"` // 是否为隐藏菜单供前台使用
	Access     int8          `json:"-" gorm:"column:access" form:"access"`                        // 子管理员是否可用
	MenuPath   string        `json:"menu_path" gorm:"column:menu_path" form:"menu_path"`          // 路由名称 前端使用
	Path       string        `json:"path" gorm:"column:path" form:"path"`                         // 路径
	AuthType   int8          `json:"auth_type" gorm:"column:auth_type" form:"auth_type"`          // 是否为菜单 1菜单 2功能
	Header     string        `json:"header" gorm:"column:header" form:"header"`                   // 顶部菜单标示
	IsHeader   int8          `json:"is_header" gorm:"column:is_header" form:"is_header"`          // 是否顶部菜单1是0否
	UniqueAuth string        `json:"-" gorm:"column:unique_auth" form:"unique_auth"`              // 前台唯一标识
	IsDel      int8          `json:"-" gorm:"column:is_del" form:"is_del"`                        // 是否删除
	Mark       string        `json:"-" gorm:"column:mark" form:"mark"`                            // 备注
	Children   []SystemMenus `gorm:"foreignKey:pid;references:ID;" form:"children" json:"children"`
	orm.SoftDeletes
}

// TableName 表名称
func (*SystemMenus) TableName() string {
	return "eb_system_menus"
}

// Tree 递归获取所有子类
func (s *SystemMenus) Tree() []SystemMenus {
	// 先查询顶层节点
	var topLevelTabs []SystemMenus
	ormInstance := facades.Orm().Query()
	if ormInstance == nil {
		panic("facades.Orm() returned nil")
	}
	ormInstance.Model(&SystemMenus{}).Select([]string{"id", "pid", "menu_name", "header", "icon", "is_header", "is_show", "path"}).
		Where("pid = ?", 0).Where("is_show=?", 1).With("Children").Find(&topLevelTabs)

	// 递归构建子节点
	for i, tab := range topLevelTabs {
		topLevelTabs[i].Children = makeChildren(&tab, ormInstance)
	}

	return topLevelTabs
}

// makeChildren 递归构建子节点
func makeChildren(parent *SystemMenus, ins contractorm.Query) []SystemMenus {
	if ins == nil {
		panic("ins is nil")
	}
	var children []SystemMenus
	ins.Model(SystemMenus{}).Where("pid = ?", parent.ID).
		Select([]string{"id", "pid", "menu_name", "header", "icon", "is_header", "is_show", "path"}).Where("is_show=?", 1).With("Children").Find(&children)
	for i, child := range children {
		// 添加调试信息
		facades.Log().Infof("Processing child: %+v", child)
		children[i].Children = makeChildren(&child, ins)
	}
	return children
}
